home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / llander.c < prev    next >
C/C++ Source or Header  |  2000-05-13  |  5KB  |  201 lines

  1. /***************************************************************************
  2.  
  3.   vidhrdw/llander.c
  4.  
  5.   Functions to emulate the blinking control panel in lunar lander.
  6.   Added 11/6/98, by Chris Kirmse (ckirmse@ricochet.net)
  7.  
  8. ***************************************************************************/
  9.  
  10. #include "driver.h"
  11. #include "vidhrdw/vector.h"
  12. #include "vidhrdw/avgdvg.h"
  13.  
  14. #define NUM_LIGHTS 5
  15.  
  16. static struct artwork *llander_panel;
  17. static struct artwork *llander_lit_panel;
  18.  
  19. static struct rectangle light_areas[NUM_LIGHTS] =
  20. {
  21.     {  0, 205, 0, 127 },
  22.     {206, 343, 0, 127 },
  23.     {344, 481, 0, 127 },
  24.     {482, 616, 0, 127 },
  25.     {617, 799, 0, 127 },
  26. };
  27.  
  28. /* current status of each light */
  29. static int lights[NUM_LIGHTS];
  30. /* whether or not each light needs to be redrawn*/
  31. static int lights_changed[NUM_LIGHTS];
  32. /***************************************************************************
  33.  
  34.   Lunar Lander video routines
  35.  
  36. ***************************************************************************/
  37.  
  38. void llander_init_colors (unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom)
  39. {
  40.     int width, height, i, nextcol;
  41.  
  42.     avg_init_palette_white(palette,colortable,color_prom);
  43.  
  44.     llander_lit_panel = NULL;
  45.     width = Machine->scrbitmap->width;
  46.     height = 0.16 * width;
  47.  
  48.     nextcol = 24;
  49.  
  50.     artwork_load_size(&llander_panel, "llander.png", nextcol, Machine->drv->total_colors-nextcol, width, height);
  51.     if (llander_panel != NULL)
  52.     {
  53.         if (Machine->scrbitmap->depth == 8)
  54.             nextcol += llander_panel->num_pens_used;
  55.  
  56.         artwork_load_size(&llander_lit_panel, "llander1.png", nextcol, Machine->drv->total_colors-nextcol, width, height);
  57.         if (llander_lit_panel == NULL)
  58.         {
  59.             artwork_free (&llander_panel);
  60.             return ;
  61.         }
  62.     }
  63.     else
  64.         return;
  65.  
  66.     for (i = 0; i < 16; i++)
  67.         palette[3*(i+8)]=palette[3*(i+8)+1]=palette[3*(i+8)+2]= (255*i)/15;
  68.  
  69.     memcpy (palette+3*llander_panel->start_pen, llander_panel->orig_palette,
  70.             3*llander_panel->num_pens_used);
  71.     memcpy (palette+3*llander_lit_panel->start_pen, llander_lit_panel->orig_palette,
  72.             3*llander_lit_panel->num_pens_used);
  73. }
  74.  
  75. int llander_start(void)
  76. {
  77.     int i;
  78.  
  79.     if (dvg_start())
  80.         return 1;
  81.  
  82.     if (llander_panel == NULL)
  83.         return 0;
  84.  
  85.     for (i=0;i<NUM_LIGHTS;i++)
  86.     {
  87.         lights[i] = 0;
  88.         lights_changed[i] = 1;
  89.     }
  90.     if (llander_panel) backdrop_refresh(llander_panel);
  91.     if (llander_lit_panel) backdrop_refresh(llander_lit_panel);
  92.     return 0;
  93. }
  94.  
  95. void llander_stop(void)
  96. {
  97.     dvg_stop();
  98.  
  99.     if (llander_panel != NULL)
  100.         artwork_free(&llander_panel);
  101.  
  102.     if (llander_lit_panel != NULL)
  103.         artwork_free(&llander_lit_panel);
  104.  
  105. }
  106.  
  107. void llander_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  108. {
  109.     int i, pwidth, pheight;
  110.     float scale;
  111.     struct osd_bitmap vector_bitmap;
  112.     struct rectangle rect;
  113.  
  114.     if (llander_panel == NULL)
  115.     {
  116.         vector_vh_screenrefresh(bitmap,full_refresh);
  117.         return;
  118.     }
  119.  
  120.     pwidth = llander_panel->artwork->width;
  121.     pheight = llander_panel->artwork->height;
  122.  
  123.     vector_bitmap.width = bitmap->width;
  124.     vector_bitmap.height = bitmap->height - pheight;
  125.     vector_bitmap._private = bitmap->_private;
  126.     vector_bitmap.line = bitmap->line;
  127.  
  128.     vector_vh_screenrefresh(&vector_bitmap,full_refresh);
  129.  
  130.     if (full_refresh)
  131.     {
  132.         rect.min_x = 0;
  133.         rect.max_x = pwidth-1;
  134.         rect.min_y = bitmap->height - pheight;
  135.         rect.max_y = bitmap->height - 1;
  136.  
  137.         copybitmap(bitmap,llander_panel->artwork,0,0,
  138.                    0,bitmap->height - pheight,&rect,TRANSPARENCY_NONE,0);
  139.         osd_mark_dirty (rect.min_x,rect.min_y,rect.max_x,rect.max_y,0);
  140.     }
  141.  
  142.     scale = pwidth/800.0;
  143.  
  144.     for (i=0;i<NUM_LIGHTS;i++)
  145.     {
  146.         if (lights_changed[i] || full_refresh)
  147.         {
  148.             rect.min_x = scale * light_areas[i].min_x;
  149.             rect.max_x = scale * light_areas[i].max_x;
  150.             rect.min_y = bitmap->height - pheight + scale * light_areas[i].min_y;
  151.             rect.max_y = bitmap->height - pheight + scale * light_areas[i].max_y;
  152.  
  153.             if (lights[i])
  154.                 copybitmap(bitmap,llander_lit_panel->artwork,0,0,
  155.                            0,bitmap->height - pheight,&rect,TRANSPARENCY_NONE,0);
  156.             else
  157.                 copybitmap(bitmap,llander_panel->artwork,0,0,
  158.                            0,bitmap->height - pheight,&rect,TRANSPARENCY_NONE,0);
  159.  
  160.             osd_mark_dirty (rect.min_x,rect.min_y,rect.max_x,rect.max_y,0);
  161.  
  162.             lights_changed[i] = 0;
  163.         }
  164.     }
  165. }
  166.  
  167. /* Lunar lander LED port seems to be mapped thus:
  168.  
  169.    NNxxxxxx - Apparently unused
  170.    xxNxxxxx - Unknown gives 4 high pulses of variable duration when coin put in ?
  171.    xxxNxxxx - Start    Lamp ON/OFF == 0/1
  172.    xxxxNxxx - Training Lamp ON/OFF == 1/0
  173.    xxxxxNxx - Cadet    Lamp ON/OFF
  174.    xxxxxxNx - Prime    Lamp ON/OFF
  175.    xxxxxxxN - Command  Lamp ON/OFF
  176.  
  177.    Selection lamps seem to all be driver 50/50 on/off during attract mode ?
  178.  
  179. */
  180.  
  181. WRITE_HANDLER( llander_led_w )
  182. {
  183.     /*      logerror("LANDER LED: %02x\n",data); */
  184.  
  185.     int i;
  186.  
  187.     for (i=0;i<5;i++)
  188.     {
  189.         int new_light = (data & (1 << (4-i))) != 0;
  190.         if (lights[i] != new_light)
  191.         {
  192.             lights[i] = new_light;
  193.             lights_changed[i] = 1;
  194.         }
  195.     }
  196.  
  197.  
  198.  
  199. }
  200.  
  201.